package com.ai.utils;

import com.ai.web.PageResp;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@Slf4j
public class ConvertUtils {

    /**
     * 支持属性名称相同但类型不同的对象转换 注意: 基于field而非getter和setter（src中只有getter无field的字段不会转换）
     *
     * @param src   被转换的对象
     * @param clazz 目标对象的类型
     * @param <T>   类型泛型
     * @return 目标对象
     */
    public static <T> T convert(Object src, Class<T> clazz) {
        if (src == null) {
            return null;
        }
        try {
            T t = clazz.newInstance();
            BeanUtils.copyProperties(src, t);
            return t;
        } catch (Exception e) {
            log.info("exception", e);
        }
        return null;
    }

    /**
     * 不同类型的List转换
     *
     * @param source 源数据
     * @param clazz  目标数据类型
     * @param <T>    目标类型
     * @return 目标类型的List
     */
    public static <T> List<T> convertList(List<?> source, Class<T> clazz) {
        if (source == null) {
            return Collections.emptyList();
        }
        return source.stream().map(it -> convert(it, clazz)).collect(Collectors.toList());
    }


    /**
     * 转化成分页相关的数据
     * @param iPage
     * @return
     * @param <T>
     */
    public static  <T> PageResp<T> convertPageResp(IPage<T> iPage){
        PageResp<T> pageResp=new PageResp<T>();
        pageResp.setPages(iPage.getPages());
        pageResp.setSize(iPage.getSize());
        pageResp.setTotal(iPage.getTotal());
        pageResp.setRecords(iPage.getRecords());
        pageResp.setCurrent(iPage.getCurrent());
        return pageResp;
    }

    /**
     * 转化成分页相关的数据
     * @param iPage
     * @return
     * @param <T>
     */
    public static  <S,T> PageResp<T> convertPageResp(IPage<S> iPage, Function<S,T> function){
        PageResp<T> pageResp=new PageResp<T>();
        pageResp.setPages(iPage.getPages());
        pageResp.setSize(iPage.getSize());
        pageResp.setTotal(iPage.getTotal());
        if(!CollectionUtils.isEmpty(iPage.getRecords())){
            List<T> collected = iPage.getRecords().stream().map(function).collect(Collectors.toList());
            pageResp.setRecords(collected);
        }
        pageResp.setCurrent(iPage.getCurrent());
        return pageResp;
    }

}
